<html>

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta name="description" content="TingGe Blog Agile agile JavaScript NodeJS">
  <meta name="author" content="TingGe<505253293@163.com>">
  <title>听歌实验室</title>
  <link type="image/x-icon" rel="shortcut icon" href="https://avatars3.githubusercontent.com/u/4074517?v=3&s=40" />
  <link rel="stylesheet" type="text/css" href="/lib/bootstrap/dist/css/bootstrap.min.css" media="screen">
  <link href="https://fonts.googleapis.com/css?family=Lato:300,400,700,300italic,400italic,700italic" rel="stylesheet" type="text/css">
  <link href="/css/landing-page.css" rel="stylesheet">
  <link href="/css/screenshots.css" rel="stylesheet">
  <style media="screen">
    #main {
      padding-top: 55px;
    }
  </style>
  <script type="text/javascript" src="/lib/jquery/dist/jquery.min.js"></script>
  <script type="text/javascript" src="/lib/html2canvas/dist/html2canvas.min.js"></script>
  <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
  <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
  <!--[if lt IE 9]>
        <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
        <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->
</head>

<body>
  <!-- Navigation -->
  <nav class="navbar navbar-default navbar-fixed-top topnav" role="navigation">
    <div class="container topnav">
      <!-- Brand and toggle get grouped for better mobile display -->
      <div class="navbar-header">
        <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
          <span class="sr-only">Toggle navigation</span>
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
        </button>
        <a class="navbar-brand topnav" href="/">
          <i class="fa fa-flask icon-3x" aria-hidden="true"></i> 听歌实验室
        </a>
      </div>
      <!-- Collect the nav links, forms, and other content for toggling -->
      <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
        <ul class="nav navbar-nav navbar-right">
          <li>
            <a href="/html/js.html">JavaScript/NodeJS</a>
          </li>
          <li>
            <a href="/index.html#agile">敏捷/项目管理(Agile/PMP)</a>
          </li>
          <li>
            <a href="/html/cloud-bi.html">云商业智能(Cloud BI)</a>
          </li>
          <li>
            <a href="/html/iot.html">物联网(WoT/IoT)</a>
          </li>
          <li>
            <a href="/html/me.html">关于我</a>
          </li>
        </ul>
      </div>
      <!-- /.navbar-collapse -->
    </div>
    <!-- /.container -->
  </nav>
  <div id="main" class="container">
    <div class="row">
      <div id="article" class="col-md-9 content-container">
        <h1 id="linux-">Linux 驱动开发</h1>
<p>[TOC]</p>
<blockquote>
<p>图形用户界面让简单的任务更容易完成， 而命令行界面使完成复杂的任务成为可能。</p>
</blockquote>
<h2 id="-">概念</h2>
<p>Linux 设计中强调的一个基本观点是：机制和策略分离。因此，驱动应是对策略透明的。</p>
<table>
<thead>
<tr>
<th></th>
<th>功能</th>
<th>运行空间</th>
<th>特征</th>
<th>一般场景</th>
</tr>
</thead>
<tbody>
<tr>
<td>策略</td>
<td>处理如何使用这些能力</td>
<td>用户空间</td>
<td>灵活</td>
<td>应用</td>
</tr>
<tr>
<td>机制</td>
<td>解决提供什么能力</td>
<td>内核空间</td>
<td>相对稳定</td>
<td>驱动</td>
</tr>
</tbody>
</table>
<h3 id="-">设备驱动与整个软硬件系统的关系</h3>
<p><img src="../img/linux-ware.png" alt="Linux 设备驱动与整个软硬件系统的关系"></p>
<p>Linux 用户空间的文件编程有两种方法，即通过 Linux API 和 通过 C 库函数访问文件。</p>
<h2 id="-">驱动分类</h2>
<ul>
<li>字符设备：按键、键盘、触摸屏、USB、鼠标等</li>
<li>块设备：硬盘、eMMC等</li>
<li>网络接口：</li>
</ul>
<h2 id="-">驱动开发</h2>
<h3 id="-">流程</h3>
<p>Linux 内核中增加程序需要完成以下3项工作：</p>
<ol>
<li>将编写的源代码复制到 Linux 内核源代码的相应目录</li>
<li>在目录的 Kconfig 文件中增加关于新源代码对应项目的编译配置选项</li>
<li>在目录的 Makefile 文件中增加对新源代码的编译条目</li>
</ol>
<h3 id="-">工具</h3>
<h4 id="shell">Shell</h4>
<p>Shell是系统的用户界面，提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。</p>
<h4 id="gcc">GCC</h4>
<p>GCC（GNU Compiler Collection，GNU编译器套装），是一套由GNU开发的编程语言编译器。通过它可将源码编译成二进制文件。</p>
<h4 id="-">启动引导程序</h4>
<p>引导程序（bootloader），使系统启动、引导进内核。通常在一个 GNU/Linux 系统中选用 GNUGRUB 做为引导程序，如 Nvidia 的 <a href="https://developer.nvidia.com/linux-tegra-r214">Linux For Tegra R21.4</a> 引导程序 <a href="http://developer.download.nvidia.com/embedded/L4T/r21_Release_v4.0/source/u-boot_src.tbz2">U-boot</a>。</p>
<h3 id="-">包管理</h3>
<p><code>apt-get</code>是debian，ubuntu发行版的包管理工具。<code>apt-get update</code>可以确保软件包列表最新。</p>
<h4 id="-">相关概念</h4>
<ol>
<li>Linux 发行版 ＝ packages ＋ 应用程序管理工具</li>
<li>软件包（package）＝ 程序 ＋ 共享库 ＋开发包 ＋ 使用说明 ＋ 元数据 ＋ 依赖关系 等</li>
<li>元数据（metadata）：用于软件包检索</li>
<li>依赖关系（dependencies）：描述软对可执行环境（对其他程序、库等）的依赖文件</li>
</ol>
<h4 id="-">常见包格式</h4>
<ul>
<li>tgz：</li>
<li>deb：标准 Debian 软件包格式</li>
<li>rpm：</li>
</ul>
<h2 id="-">编程风格</h2>
<ul>
<li><a href="http://lxr.free-electrons.com/">Documents/CodingStyle</a></li>
<li><a href="scripts/checkpatch.pl">scripts/checkpatch.pl</a>：检查代码风格是否符合 CodingStyle</li>
<li>工程阶段，一般可以在 SCM 软件的服务器端用 pre-commit hook，自动检查工程师提交的代码是否符合 Linux 的编码风格，如果不符合，则自动拦截</li>
</ul>
<h3 id="-">字符设备驱动</h3>
<p><img src="../img/cdev.png" alt="字符设备驱动的结构"></p>
<h4 id="cdev-">cdev 结构体</h4>
<ul>
<li>register_chrdev_region() 或 alloc_chrdev_region() 向系统申请设备号</li>
<li>cdev_add() 向系统注册字符设备</li>
<li>cdev_del() 从系统注销字符设备</li>
<li>unregister_chrdev_region() 释放已申请的设备号</li>
</ul>
<h4 id="file_operations-">file_operations 结构体</h4>
<h2 id="-">设备驱动的分层思想</h2>
<ol>
<li>输入设备驱动</li>
<li>RTC 设备驱动</li>
<li>Framebuffer 设备驱动</li>
<li>终端设备驱动</li>
<li>misc 设备驱动</li>
</ol>
<h2 id="-">附录</h2>
<p>建议 “微信读书” 王宝华的《Linux 设备驱动开发详解：基于最新的 Linux 4.0 内核》</p>
<ol>
<li><a href="https://pan.baidu.com/s/1o8ncCSa">Ubuntu 的 VirtualBox 镜像</a> (提取码 m7g5)。系统中 账号、密码 &quot;baohua&quot;</li>
<li><a href="http://lxr.free-electrons.com/">Linux Cross Reference</a>：Linux内核源码的交叉索引</li>
<li>minicom：串口通信工具</li>
<li><a href="https://github.com/martinezjavier/ldd3">Linux Device Drivers 3 examples</a></li>
<li><a href="https://www.linuxquestions.org/">LinuxQuestions</a></li>
<li><a href="http://kernelnewbies.org/LinuxVersions">Linux Kernel Newbies</a>：Linux 每个版本具体变更</li>
<li><a href="http://www.linuxfoundation.org/news-media/lwf">Linux Weather Forecast</a>：Linux 近期热点和走向</li>
<li><a href="./linux_kernel.html">Linux 内核</a></li>
<li><a href="./hardware.html">硬件基础</a></li>
<li><a href="http://wiki.ubuntu.org.cn/">Ubuntu 中文</a></li>
</ol>

      </div>
      <div class="col-md-3" style="padding-top:20px;">
        <iframe src="http://githubbadge.appspot.com/tingge?a=0" style="border: 0;height: 142px;width: 200px;overflow: hidden;" frameBorder="0"></iframe>
      </div>
    </div>
  </div>
  <a id="html2canvas" title="截图下载-快照">&nbsp;</a>
  <script src="/lib/bootstrap/dist/js/bootstrap.min.js"></script>
  <script src="/js/article.js" charset="utf-8"></script>
  <!-- justice.js https://github.com/okor/justice  -->
  <script src="/lib/justice.min.js" charset="utf-8"></script>
  <!-- instantclick -->
  <script src="/lib/instantclick.js" charset="utf-8"></script>
  <script type="text/javascript" data-no-instant>
    Justice.init();
  </script>
</body>

</html>
